package br.com.guarana.util;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

/**
 * 
 * @author 
 */
public class PadraoDAO {
    private EntityManager entityManager;

    public EntityManager getEntityManager() {
        if ((entityManager == null) || (!entityManager.isOpen())) {
            entityManager = JPAHelper.createEntityManager();
        }
        return entityManager;
    }

    public void setEntityManager(EntityManager em) {
        this.entityManager = em;
    }

    public void criar(Object objeto) {
        getEntityManager().persist(objeto);
        getEntityManager().flush();
    }

    public void salvar(Object objeto) {
        getEntityManager().merge(objeto);
    }

    public void excluir(Object objeto) {
        getEntityManager().remove(getEntityManager().merge(objeto));
    }

    public Object find(Class classe, Object id) {
        return this.getEntityManager().find(classe, id);
    }

    public void salvarLista(List lista) {
        for (Object objeto : lista) {
            this.salvar(objeto);
        }
    }

    public void criarLista(List lista) {
        for (Object objeto : lista) {
            this.criar(objeto);
        }
    }

    public List listaTodosDaClasse(Class classe) {
        Query query = getEntityManager().createNamedQuery(classe.getSimpleName() + ".find" + classe.getSimpleName() + "All");
        List retorno = query.getResultList();

        return retorno;
    }

    public List listaNamedQuery(String nomeQuery) {
        Query query = getEntityManager().createNamedQuery(nomeQuery);
        List retorno = query.getResultList();

        return retorno;
    }

    public Boolean existeObjetoComId(Class classe, Object id) {
        Query query = getEntityManager().createNamedQuery(classe.getSimpleName() + ".find" + classe.getSimpleName() + "ById");
        query.setParameter("id", id);
        List resultado = query.getResultList();

        if ((resultado == null) || (resultado.size() == 0)) {
            return false;
        } else {
            return true;
        }
    }
    
    public String retornaNome(Class classe, Object id) {
        Query query = getEntityManager().createNamedQuery(classe.getSimpleName() + ".find" + classe.getSimpleName() + "NomeById");
        query.setParameter("id", id);
        List resultado = query.getResultList();
        getEntityManager().clear();

        if ((resultado == null) || (resultado.size() == 0)) {
            return null;
        } else {
            return resultado.iterator().next().toString();
        }
    }

    public Object retornaObjeto(Class classe, Object id) {
        Query query = getEntityManager().createNamedQuery(classe.getSimpleName() + ".find" + classe.getSimpleName() + "ById");
        query.setParameter("id", id);
        List resultado = query.getResultList();
        getEntityManager().clear();

        if ((resultado == null) || (resultado.size() == 0)) {
            return null;
        } else {
            return resultado.iterator().next();
        }
    }
       
    public Object retornaObjetoPorNome(Class classe, Object nome) {
        Query query = getEntityManager().createNamedQuery(classe.getSimpleName() + ".find" + classe.getSimpleName() + "ByNome");
        query.setParameter("nome", nome);
        List resultado = query.getResultList();

        if ((resultado == null) || (resultado.size() == 0)) {
            return null;
        } else {
            return resultado.iterator().next();
        }
    }

    public List consultaNativa(String sql) {
        Query query = getEntityManager().createNativeQuery(sql);
        return query.getResultList();
    }

    public List consultaLinhaNativa(String sql) {
        Query query = getEntityManager().createNativeQuery(sql);
        return (List) query.getResultList().iterator().next();
    }    
}
